//package cn.jsu.oj.dispatchServer.job;
//
//import cn.jsu.oj.dispatchServer.init.JudgeClient;
//import cn.jsu.oj.dispatchServer.pojo.TaskInfo;
//import cn.jsu.oj.dispatchServer.pojo.TaskSumInfo;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//
//import java.util.Map;
//
//import static cn.jsu.oj.dispatchServer.resource.Resource.storeTaskMap;
//import static cn.jsu.oj.dispatchServer.thread.DispatchThread.judgeMap;
//
//@Component
//@Slf4j
//public class ScheduleTaskConfig {
//
//    /**
//     * 扫描暂存队列，防止暂存队列溢出
//     * 同时保证每一次提交都有一个判题结果
//     * 也防止有时因为网络抖动导致暂存队列没有消掉
//     *
//     * 3分钟执行一次
//     */
//    @Scheduled(fixedRate = 60 * 1000)
//    public void scheduledTask() throws Exception {
//        for (Map.Entry<String, Map<Long, TaskInfo>> e : storeTaskMap.entrySet()) {
//            //首先遍历一个判题机的暂存队列
//            String judgeIp = e.getKey();
//            log.info("开始扫描判题机{}--暂存队列残留任务",judgeIp);
//            Map<Long, TaskInfo> tasks = e.getValue();
//            for (Map.Entry<Long, TaskInfo> task : tasks.entrySet()) {
//                TaskInfo taskInfo = task.getValue();
//                //如果暂存队列的任务 时间超过一分钟，就对判题任务进行重发
//                    //选择一个判题机
//                    JudgeClient select = select(taskInfo.getSerialNumber());
//                    select.getMappingQueue().add(taskInfo);
//                    select.getChannel().writeAndFlush(new TaskSumInfo(select.getMappingQueue().size()).serialize());
//                    log.info("序列号:{} 在暂存队列超时，重新判题",task.getKey());
//
//            }
//        }
//    }
//
//    /**
//      由于在分发任务时，可能存在二次选举。故无法使用求余的方式补偿分发判题任务。
//     */
//    public JudgeClient select(long serialNumber ) throws Exception {
//
//        for (JudgeClient judgeClient : judgeMap) {
//            Map<Long, TaskInfo> storeMap = judgeClient.getStoreMap();
//
//           if (storeMap.get(serialNumber) != null) {
//               return judgeClient;
//           }
//        }
//        //不存在这种可能
//        return judgeMap.get(0);
//
//
////        if (traceCount > judgeMap.size()){
////            if (judgeMap.size() == 0) {
////                throw new Exception("任务调度暂未连上判题机");
////            }
////            throw new Exception("所有映射队列长度已满");
////        }
//
////        long judgeClientIndex = serialNumber % (long)judgeMap.size();
////        JudgeClient selector = judgeMap.get((int) judgeClientIndex);
////        if (  selector.getMappingQueue().size() < 100) {
////            return selector;
////        }
////        else {
////            traceCount += 1;
////            return select(taskInfo,serialNumber +1,traceCount);
////        }
//
//
//    }
//
//
//}
